Gunicorn Worker Types
2017년 11월 16일 목요일
오후 1:32
링크: https://www.spirulasystems.com/blog/2015/01/20/gunicorn-worker-types/
- 간결, 강력한 파이썬 WSGI (Web Server Gateway
Interface) HTTP server 이다.
- pre-fork 모델 서버이다.
- master process 가 시작하고
- worker process 들이 master 에서 fork 된다.
* worker 는 request 를 handling 하고 response를 돌려준다
- worker-class 옵션으로 worker type을 설정할 수 있다.
- 옵션값은 sync, gevent, eventlet, tornado, gaiohttp, gthread
를 줄 수 있다.
- Sync, Async, Tornado, AsyncIO type을 지원하며 default는 Sync 이다
- Gunicorn의 default worker type
- 각각의 worker는 한번에 하나의 request를 처리한다 (Apache webserver의 prefork mpm model과
유사)
- 긴 disk I/O 와 같은 external request가 필요없는
어플리케이션에서 사용한다
- 하나의 request가 처리되는 동안, 다음 request는 기다려야 하고, 결국 timeout 이 걸리면 fail
- 동시성 (Concurrency)을 지원한다 = 하나 이상의 request 를 처리할 수 있다.
- Gevent 또는 Eventlet 으로
다시 나눌수 있다.
- 둘 다 Greenlet library에서 나온 것이며, Greenlet 은 coroutines를 파이썬으로 구현한 것
- 둘 다 green threads 를 사용한다. = program level의 threads (not OS level)
- 어플리케이션에서 별도로
해줄 것은 없다
아래 그림을
보며 위 Sync Worker와 비교해보자
- Sync: 만약 External I/O 작업을 한다면, 작업 회신이 올때까지 Worker는 놀면서 기다리는 거다
- Async: External I/O 작업을 지시해놓고, 완료되면 알려달라고 한 다음에 그 다음 Request를 수행하는 거다
Tornado python framework 와 연동하기 위해 디자인되었다.
- 다른 python framework 로는 Flask, Django 등이 있음
- Async I/O non-blocking design model 을 제공한다
- 한 줄 요약하자면 Tornado framework 특화된 Async worker
- 다른 framework에 붙여도 되지만 굳이 그러진 말자
- gthread와 gaiohttp로 나눌 수 있다.
- gaiohttp
- aiohttp library를 사용. client / server 양쪽의 asynchronous
I/O networking 을 구현해 둔 라이브러리임
- web socket을
지원함
- gthread
- full threaded worker
- thread pool에는 (여러 thread 중 하나가 처리할) 이벤트를 기다리면서 항상 연결되어 있다.
어떤 Worker type을 쓸 것인가는 어플리케이션의 성격에 달려있다.
- CPU bounded or external I/O bounded - 즉, CPU를 많이 쓰는가, external I/O를 많이 쓰는가
Microsoft OneNote 2016에서 작성